package org.xq.softcup.mq.admin.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.util.ArrayList;
import java.util.List;

/**
 * @author admin
 * Json转化类
 */
public class FastJsonUtil {
    private static final SerializerFeature[] featuresWithNullValue = {SerializerFeature.WriteMapNullValue,
            SerializerFeature.WriteNullBooleanAsFalse,
            SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullNumberAsZero, SerializerFeature
            .WriteNullStringAsEmpty};

    /**
     * 方法名称：将JSON字符串转换为实体对象
     * 概要说明：将JSON字符串转换为实体对象
     *
     * @param data  JSON字符串
     * @param clzss 转换对象
     * @return T
     */
    public static <T> T jsonToObject(String data, Class<T> clzss) {
        try {
            T t = JSON.parseObject(data, clzss);
            return t;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 方法名称：将JSONObject对象转换为实体对象
     * 概要说明：将JSONObject对象转换为实体对象
     *
     * @param data  JSONObject对象
     * @param clzss 转换对象
     * @return T
     */
    public static <T> T jsonToObject(JSONObject data, Class<T> clzss) {
        try {
            T t = JSONObject.toJavaObject(data, clzss);
            return t;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 方法名称：将JSON字符串数组转为List集合对象
     * 概要说明：将JSON字符串数组转为List集合对象
     *
     * @param data  JSON字符串数组
     * @param clzss 转换对象
     * @return List<T>集合对象
     */
    public static <T> List<T> jsonToArray(String data, Class<T> clzss) {
        try {
            List<T> t = JSON.parseArray(data, clzss);
            return t;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 方法名称：将List<JSONObject>转为List集合对象
     * 概要说明：将List<JSONObject>转为List集合对象
     *
     * @param data  List<JSONObject>
     * @param clzss 转换对象
     * @return List<T>集合对象
     */
    public static <T> List<T> jsonToArray(List<JSONObject> data, Class<T> clzss) {
        try {
            List<T> t = new ArrayList<T>();
            for (JSONObject jsonObject : data) {
                t.add(jsonToObject(jsonObject, clzss));
            }
            return t;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 方法名称：将对象转为JSON字符串
     * 概要说明：将对象转为JSON字符串
     *
     * @param obj 任意对象
     * @return JSON字符串
     */
    public static String objectToJSON(Object obj) {
        try {
            String text = JSON.toJSONString(obj);
            return text;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 方法名称：将对象转为(JSON字符串)
     * 概要说明：将对象转为(JSON字符串)
     *
     * @param obj 任意对象
     * @return JSON字符串
     */
    public static String objectToJSONBracket(Object obj) {
        try {
            String text = JSON.toJSONString(obj);
            return "(" + text + ")";
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 方法名称：将对象转为JSONObject对象
     * 概要说明：将对象转为JSONObject对象
     *
     * @param obj 任意对象
     * @return JSONObject对象
     */
    public static JSONObject objectToJSONObject(Object obj) {
        try {
            JSONObject jsonObject = (JSONObject) JSONObject.toJSON(obj);
            return jsonObject;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    public static String objectToJSONWithNullValue(Object obj) {
        try {
            String text = JSON.toJSONString(obj, featuresWithNullValue);
            return text;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
